package utils;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;

public class ListUtils {

    /**
     * 移除列表中指定的number
     *
     * @param numbers 传入一个需要移除的原数组
     * @param start   开始点
     * @param move    需要移除的元素
     * @param <T>     需要指定传入泛型
     * @return 返回移除完成后的新数组
     */
    public static <T extends Comparable<T>> List<T> removeSomeNumber(List<T> numbers, int start, T move) {
        List<T> moved = new ArrayList<>();
        IntStream.range(0, numbers.size()).forEach(item -> {
            if (item < start || !numbers.get(item).equals(move)) {
                moved.add(numbers.get(item));
            }
        });
        return moved;
    }

    /**
     * 移除列表中指定的number,按照times进行缩放
     *
     * @param numbers 传入原始列表
     * @param start   开始位置
     * @param move    移除数值
     * @param times   缩放倍数
     * @return 返回缩放后的列表
     */
    public static List<Float> removeSomeNumber(List<Integer> numbers, int start, int move, float times) {
        List<Float> moved = new ArrayList<>();
        IntStream.range(0, numbers.size()).forEach(item -> {
            if (item < start) {
                moved.add(numbers.get(item) / times);
            } else {
                if (numbers.get(item) != move) {
                    moved.add(numbers.get(item) / times);
                }
            }
        });
        return moved;
    }


    /**
     * 移除列表中指定的number,按照times进行缩放，并对不为0的数按照add进行增加
     *
     * @param numbers 传入原始列表
     * @param start   开始位置
     * @param move    移除数值
     * @param times   缩放倍数
     * @param add     需要增加的数
     * @return
     */
    public static List<Float> removeSomeNumberAndAdd(List<Integer> numbers, int start, int move, float times, float add) {
        List<Float> moved = new ArrayList<>();
        IntStream.range(0, numbers.size()).forEach(item -> {
            if (item < start) {
                if (numbers.get(item) == 0) {
                    moved.add(0f);
                } else {
                    moved.add((numbers.get(item) / times) + add);
                }
            } else {
                if (numbers.get(item) != move) {
                    moved.add((numbers.get(item) / times) + add);
                }
            }
        });
        return moved;
    }
}
